Planificarea proceselor
Gestionarea unitatilor centrale de prelucrare ale unui sistem constituie activitatea esentiala a unui sistem de operare multitasking. Activitatea de planificare a procesorului poate fi divizata in doua clase diferite: planificarea de nivel inalt sau pe termen lung si planficarea pe termen scurt. Prima se ocupa cu introducerea in sistem a programului utilizatorului si cu secventierea diferitelor procese care il compun. Intrucit ea poate fi implementata sub forma unui proces (un proces al sistemului, mai curind decit al utilizatorului), implementarea se face, practic, prin program, si ea nu va fi discutata in cele ce urmeaza. Planificarea de nivel redus se ocupa de secventierea executiei proceselor prezente in sistem la un anumit moment de timp si este cu mult mai apropiata de hardware. Planificarea de nivel inferior constituie subiectul celor ce urmeaza. Termenul "planificarea proceselor" se refera la un astfel de tip de planificare.
1. Starile unui proces
Modul tipic de abordare a problemei planificarii proceselor se bazeaza pe asocierea unei stari anumite fiecarui proces din sistem. In functie de tipul de calculator si sistem de operare, exista un numar de stari ale procesoarelor, ca si un numar de definitii ale acestor stari. Pentru ilustrare se va utiliza modelul din fig. 3.9., cu urmatoarele definitii:
1.a.In rulare (running): Un proces in aceasta stare este executat de catre CPU sau de catre o CPU a sistemului. De aceea, se considera ca are o  prioritate superioara altor procese gata de rulare;
1.b.Gata de rulare (ready): Un proces in aceasta stare este gata de a fi rulat, dar nu este executat, deoarece prioritatea sa este mai mica decit a proceselor aflate in rulaj. In aceasta stare toti parametrii asociati procesului si care influenteaza decizia de planificare sint cunoscuti planificatorului;
1.c.In asteptare (waiting): Un proces aflat in aceasta stare nu poate fi executat, intrucit el asteapta producerea unui eveniment special in sistem, a carui aparitie va pune procesul in starea  gata de rulare, in functie de prioritatea procesului;
1.d.Activ (active): Un proces in aceasta stare nu poate fi considerat pentru executie, intrucit el are nevoie de o comanda speciala pentru a trece, in functie de prioritate, fie in starea in rulare fie in starea gata de rulare; 
1.e.Inactiv (inactive): Un proces aflat in aceasta stare nu poate fi planificat, pentru ca, desi este prezent in sistem, are nevoie de o comanda explicita din partea unuia dintre procesele care se executa, sau din partea planificatorului, pentru a intra in starea activa si pentru a i se asigura parametrii de planificare.
Tranzitia intre stari a proceselor poate fi produsa de mai multe evenimente, dupa cum urmeaza:
A. Starea inactiva
Aceasta stare constituie o interfata intre planificatorul pe termen lung si planificatorul pe termen scurt: un proces este creat de catre planificatorul pe termen lung si este introdus in starea inctiva. Un proces poate fi inlaturat dinsistem, prin distrugere, daca planificatorul pe termen lung considera ca nu  este necesara prelucrarea de catre sistem a procesului inactiv.  Un proces inactiv poate fi activat si i se pot asigura parametrii ceruti de algoritmul de planificare pe termen scurt. Realizarea acestei tranzitii se face la cererea explicita a procesului aflat in rulare sau a planificatorului. 
Tranzitia in sens opus se poate face numai cind procesul este in starea activa. In acest caz se emite o cerere explicita de catre procesul aflat in rulaj (eventual   o rutina de planificare), folosita pentru  dealocarea intregii structuri de comanda (cum este descriptorul procesului) folosit de catre planificatorul pe termen scurt.
In general, procesele ce revin in starea inactiva sint evacuate din sistem, intrucit ele s au executat cu succes sau au esuat, asa ca rularea lor nu mai este necesara.
B. Starea activa
Un proces in starea activa are alocata toata structura de comanda ceruta de catre planificator, deci procesul este gata sa concureze pentru obtinerea CPU. Totusi, numai ca urmare a unei comenzi explicite procesul este transpus in starea gata de rulare sau in rualre, dupa cum prioritatea procesului este inferioara sau superioara celei a procesului aflat in rulare. 
Cind un proces comuta din starea activa in cea gata de executie si, apoi, in starea de executie, el este executat de la inceput; contorul programului va fi initializat cu adresa punctului de intrare a programului principal executat de catre proces. Daca un proces concureaza de doua ori pentru obtinerea CPU, el este reinitializat de fiecare data cind paraseste starea activa. Acest tip de comutare in starea gata de rulare sau in cea de rulare este diferit de cel de parasire a starii de asteptare, caz in care procesul nu este reinitializat, ci executia sa reluata prin restaurarea starii la momentul la care procesului i s a luat accesul la CPU. Suplimentar utilizarii ca stare intermediara intre lumea exterioara si concurenta pentru CPU, starea activa poate fi folosita pentru relansarea unui proces care a fost afectat de o eroare reparabila, sau pentru executarea proceselor care necesita mai multe executii.
C. Starea de asteptare
Singurul mod de intrare in starea de asteptare consta in executia unei actiuni de suspendare cind procesul se afla in starea in rulare. Operatiile tipice producind suspendarea procesului sint:
->tentativa de a intra intr o regiune critica ocupata;
->semnalizarea la un semafor plin;  transmiterea unui mesaj catre o cutie postala plina;
->primirea unui semnal de la un semafor gol;
->primirea unui mesaj de la o cutie postala vida.
Orice proces care incearca sa efectueze una dintre operatiile enumerate nu mai poate continua sa fie executat pina in momentul in care entitatea (regiune critica, semafor sau cutie postala) si a schimbat starea, ceea ce permite reluarea procesului. Operatiile efectuate de catre procesul in rulare, care ar putea comuta un proces din starea de asteptare in cea gata de rulare sau chiar in starea in rulare, sint: 
->iesirea din regiunea critica;    
->semnalizarea la un semafor vid;
->transmiterea unui mesaj catre o cutie postala vida;
->primirea unui semnal de la un semafor plin;
->primirea unui mesaj de la o cutie postala plina.
Cind una dintre aceste operatii conduce la extragerea unui proces din starea de asteptare, controlul asupra CPU trece in sarcina planificatorului, astfel incit acesta poate decide daca procesul activat detine prioritatea cea mai inalta. In caz afirmativ, procesul ce iese din starea de asteptare este trecut direct in starea in rulare; in caz contrar el intra in starea gata de rulare. 
D. Starea gata de rulare
Tranzitiile in starea gata de rulare reprezinta alternativa la tranzitiile in starea de rulare (cu exceptia acelora spre starea de asteptare), deoarece diferenta intre procesele aflate in cele doua stari este doar o chestiune de prioritate. In consecinta, tranzitiile intre starile gata de rulare si in rulare sint cauzate de modificari de prioritati relative ale proceselor executabile. 
Diferenta majora consta in faptul ca procesele in starea gata de rulare nu isi pot modifica ele insele starea, in timp ce procesele in rulare pot efectua tranzitii de stare prin executarea de actiuni corespunzatoare.
E. Starea in rulare
Procesele in starea in rulare sint singurele care pot provoca tranzitii de stare ale altor procese, ca si pentru ele insele. Deci, este posibila parasirea acestei stari drept consecinta a unei actiuni explicite, programata de catre utilizator, cum este terminarea normala a unui proces sau dezactivarea temporara. De asemenea, este posibil ca un proces sa fie fortat sa elibereze CPU drept consecinta a unei actiuni din program care nu a avut destinatia explicita de a produce o tranzitie de stare a procesului. Aceste actiuni se pot imparti in doua clase: acelea care produc tranzitia in starea de asteptare si acelea care produc tranzitia procesului curent in starea gata de rulare. Prima clasa a fost discutata anterior. In cea de a doua intra actiunile care produc activarea sau reluarea altor procese. Cum procesul activat ar putea avea o prioritate superioara celui care l a activat, pot aparea schimbari in prioritatile relative pentru toate procesele ce indeplinesc conditiile de rulare, caz in care procesul in rulare este trecut in starea gata de rulare. 
Un al treilea tip de eveniment care produce parasirea de catre un prroces a starii in rulare este constituit de actiunea declansata de aparitia unor situatii externe sau interne neobisnuite, care nu pot fi prevazute de catre programator. Astfel de evenimente includ intreruperi sau exceptiii fatale ce apar pe durata executiei procesului. Ambele pot fi considerate ca evenimente care activeaza procese speciale, constituite din rutinele de tratare corespunzatoare. Intre cele doua tipuri de evenimente exista, totusi, diferente. Rutinele de tratare a conditiilor fatale de exceptie (overflow, violarea protectiei) se executa ori de cite ori ele sint activate de catre conditiile corespunzatoare, deci au intotdeauna prioritate superioara procesului care le a generat. 

2. Planificarea in conditiile prezentei intreruperilor
Intreruperile sint folosite pentru a informa CPU asupra unor evenimente importante prin efectele lor asupra activitatii sistemului. De exemplu, o intrerupere anuntind terminarea unui proces I/O efectuat de un periferic lent este mai putin importanta decit una asociata unui dispozitiv mai rapid, deci este important ca prima sa nu intrerupa executia rutinei de tratare a celei de a doua intreruperi.
Este necesara existenta unui mecanism care sa recunoasca doar intreruperile de prioritate ridicata. Cu alte cuvinte, o cerere de intrerupere este confirmata doar daca ea are o prioritate superioara procesului aflat in rulaj. Intreruperile sint evenimente externe si sint gestionate prin mijloace hardware. Deci, cind un proces este trecut in starea de rulare, prioritatea sa trebuie facuta cunoscuta dispozitivului de tratare a cererilor de intrerupere, fapt ce permite dezactivarea intreruperilor cu prioritati egale sau inferioare celei a procesului.
Daca instalarea unui nou proces face ca prioritatea CPU sa scada sub nivelul unei cereri de intrerupere asteptind tratarea,  rutina de tratare a cererii mentionate se trece in starea in rulaj, procesul intrerupt trecind in starea gata de rulare. Cind rularea rutinei de tratare a intreruperii se termina, ea apeleaza planificatorul pentru a determina urmatorul proces ce trebuie executat. Decizia planificatorului poate fi infirmata de catre mecanismul de intreruperi in cazul in care intreruperi prioritare asteapta tratarea.
Dispozitivul de tratare a cererilor de intreruperi poate fi considerat drept componenta a planificatorului, implementat sub forma hardware. In acelasi mod, rutinele de tratare a intreruperilor ce asteapta atentia unitatii centrale pot fi considerate ca fiind in starea gata de rulare, intrucit executia lor va incepe imediat ce prioritatea procesului aflat in rulare scade sub cea a cererilor de intreruperi.

3. Planificarea in sisteme multiprocesor
Mecanismul de planificare descris mai sus poate fi comod implementat, prin mijloace software, la care se adauga un dispozitiv de tratare a intreruperilor in sistemele cu procesor unic. Lucrurile se complica in conditiile unui sistem cu mai multe procesoare. Intr un sistem multi procesor fiecare proces in rulare este asignat  unei CPU si exista doua posibilitati ca un proces sa fie executat de catre sistem: orice proces poate fi rulat de catre orice CPU sau procesele pot fi grupate in submultimi, fiecare din ele alocata unei CPU. Prima situatie se intilneste in sistemele de uz general, pentru care sistemul este considerat ca un tot unitar. Deci, exista un singur grup de procese pentru fiecare din starile posibile.
Cind un proces este trecut in starea in rulare, oricare dintre CPU poate fi utilizata pentru a l rula. Totusi, de regula, se selecteaza CPU care ruleaza procesul cu cea mai mica prioritate. Acesta este trecut in starea de asteptare. 
A doua varianta de sistem multiprocesor contine un numar de copii ale situatiei sistemului cu procesor unic. Deci, fiecare CPU are propriile sale grupuri de procese in starea gata de rulare, activa sau inactiva, si un singur proces in starea in rulare. Aceste sisteme sint folosite, de regula, in aplicatiile de timp real, pentru care perifericele I/O conectate la fiecare CPU dicteaza locul de executie al fiecarui proces. Diferenta intre acest tip de sistem multiprocesor si un set de sisteme multiutilizator, dar cu un procesor unic, consta in faptul ca procesele rulind pe diferitele CPU se pot sincroniza, pot comunica intre ele sau pot concura pentru resurse comune.
In ambele tipuri de sistem, o operatie efectuata de catre un proces rulind pe CPUi poate face ca CPUj sa comute de la executia procesului A la cea a procesului B. Replanificarea unei CPU necesita un anumit suport hardware pentru transmiterea informatiei de la CPUi la CPUj pentru a indica noile conditii.
Intrucit operatia care produce replanificarea apare pe o alta CPU decit cea care comuta procesul pe care il executa, ea constituie un eveniment extern pentru a doua CPU, fapt ce justifica implementarea cu ajutorul intreruperilor a acestui tip de comunicatie interprocesor.
se pot concepe mai multe metode de implementare a intreruperilor interprocesor. O solutie consta in utilizarea unor celule speciale de memorie in zona comuna de memorie, fiecare generind, cind se scrie in ea, o cerere de intrerupere spre o anumita CPU. In modul acesta o CPU se poate intrerupe prin efectuarea unei operatii de inscriere la o adresa speciala. Datele inscrise in locatiile speciale pot indica sursa intreruperii.
O alta solutie consta in utilizarea unui set de linii speciale in cadrul magistralei comune, rezervate generarii cererilor de intreruperi interprocesor. Un caz particular este cel utilizind o unica linie de difuzare (broadcasting) care transmite serial mesaje de intrerupere. Mesajele includ identificatori privind sursa si destinatia intreruperii, precum si date indicind motivul intreruperii. Tehnica este recomandata de o serie de standarde: Future Bus (IEEE P896), VME, Multibus II.